//package com.newaim.util.aop;
//
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.auth0.jwt.JWT;
//import com.auth0.jwt.JWTVerifier;
//import com.auth0.jwt.algorithms.Algorithm;
//import com.newaim.exception.CustomException;
//import com.newaim.util.Assert;
//import com.newaim.util.DateUtils;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.*;
//import org.springframework.scheduling.annotation.Async;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//import javax.servlet.http.HttpServletRequest;
//import java.io.PrintWriter;
//import java.io.StringWriter;
//import java.util.ArrayList;
//import java.util.Enumeration;
//import java.util.List;
//
//@Slf4j
//@Aspect
//@Component
//public class RequestAop {
//
//    static final List<String> NO_LOGIN_URL = new ArrayList<String>() {
//        {
//            add("/login");
//        }
//    };
//
//    @Pointcut("execution(* com.newaim..*.*Controller.*(..))")
//    public void init() {
//    }
//
//    @Before("init()")
//    public void beforeAdvice(JoinPoint joinPoint) {
//    }
//
//    @Around("init()")
//    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//        long startTime = System.currentTimeMillis();
//        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//        String url = request.getRequestURI();
//
//		if(!NO_LOGIN_URL.contains(url) ) {
//			String token = request.getHeader("Authorization");
//			Assert.notEmpty(token,"Authorization cannot be empty");
//            try {
//                JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("newAim")).build();
//                jwtVerifier.verify(token);
//            }catch (Exception e){
//                throw new CustomException("Authorization error");
//            }
//            String user = JWT.decode(token).getAudience().get(0);
//            UserContext.set(JSONObject.parseObject(user,SysUser.class));
//		}
//
//        Object obj;
//        String bodyArgs = this.bodyArgs2String(request, joinPoint.getArgs(), url);
//        JSONObject urlArgs = this.urlArgs2String(request, request.getParameterNames(), url);
//        try {
//            obj = joinPoint.proceed();
//            long endTime = System.currentTimeMillis();
//            this.logInfo(request, url, bodyArgs, urlArgs, "success", 200, endTime - startTime, true);
//        } catch (Throwable e) {
//            log.error("===Request error: ", e);
//            long endTime = System.currentTimeMillis();
//            if (e instanceof CustomException) {
//                CustomException ex = (CustomException) e;
//                this.logInfo(request, url, bodyArgs, urlArgs, ex.getMsg(), 400, endTime - startTime, false);
//                throw ex;
//            } else {
//                StringWriter stringWriter = new StringWriter();
//                e.printStackTrace(new PrintWriter(stringWriter));
//                this.logInfo(request, url, bodyArgs, urlArgs, "====Exception====: " + stringWriter.toString(), 400, endTime - startTime, false);
//                throw new CustomException("====Exception====," + e.getMessage());
//            }
//        } finally {
//            UserContext.remove();
//        }
//
//        return obj;
//    }
//
//    @Async
//    private void logInfo(HttpServletRequest request, String url, String bodyArgs, JSONObject urlArgs, String message, Integer status, long executionTime, boolean isSuccess) {
//            JSONObject json = new JSONObject();
//            json.put("requestType", request.getMethod());
//            json.put("url", url);
//            if (UserContext.get() != null) {
//                json.put("userName", UserContext.get().getName());
//            }
//            json.put("visitTime", DateUtils.nowString());
//            json.put("message", message);
//            json.put("status", status);
//            json.put("executionTime", executionTime);
//            json.put("bodyArgs", bodyArgs);
//            json.put("urlArgs", urlArgs);
//
//            if (status != 200) {
//                log.error("\r\n" + json.toJSONString());
//            } else {
//                log.info("\r\n" + json.toJSONString());
//            }
//
//    }
//
//    @After("init()")
//    public void afterAdvice(JoinPoint joinPoint) {
//    }
//
//    private String bodyArgs2String(HttpServletRequest request, Object[] bodyArgs, String url) {
//        if ("GET".equals(request.getMethod())) {
//            return "";
//        }
//        if (url != null && url.contains("upload")) {
//            return "";
//        }
//        if (url != null && url.contains("image")) {
//            return "";
//        }
//        if (url != null && url.contains("import")) {
//            return "";
//        }
//        try {
//            if (bodyArgs != null && bodyArgs.length > 0) {
//                String body = JSONArray.toJSONString(bodyArgs);
//                if (body.contains("image")) {
//                    return "";
//                }
//                return body;
//            }
//        } catch (Exception e) {
//        }
//        return "";
//    }
//
//    private JSONObject urlArgs2String(HttpServletRequest request, Enumeration<String> urlArgs, String url) {
//        JSONObject urlArgsJson = new JSONObject();
//        try {
//            if (urlArgs != null) {
//                while (urlArgs.hasMoreElements()) {
//                    try {
//                        String paraName = urlArgs.nextElement();
//                        urlArgsJson.put(paraName, request.getParameter(paraName));
//                    } catch (Exception e) {
//                        log.error("======Url parameter error", url);
//                        break;
//                    }
//                }
//            }
//        } catch (Exception e) {
//            log.error("======Url parameter error, " + url);
//        }
//        return urlArgsJson;
//    }
//
//}
